package cn.edu.scau.cmi.liangzijian.singleton;

import java.util.HashMap;
import java.util.Map;

public class Marshal {
	private final String name;
	
	private static final int maxObjectAmount = 10;
	private static int curObjectIndex = 0;
	
	private static Marshal[] marshals = new Marshal[maxObjectAmount];
	private static Map<String, Marshal> marshalMap = new HashMap<String, Marshal>();
	
	private boolean isNew = true;
	
	private Marshal(String name) {
		this.name = name;
	}
	
	static public Marshal getInstance(String name) {
		for(int i = 0; i < curObjectIndex; i++) {
			if(marshals[i].getName().equals(name)) {
				return marshals[i];
			}
		}
		
		if(curObjectIndex == maxObjectAmount) {
			return null;
		}
		
		Marshal marshal = new Marshal(name);
		marshals[curObjectIndex] = marshal;
		curObjectIndex += 1;
		
		return marshal;
	
		//使用hashMap来实现
		/*if(marshalMap.containsKey(name))
			return marshalMap.get(name);
		else if(marshalMap.size() < maxObjectAmount) {
			marshalMap.put(name, new Marshal(name));
		}*/
	}
	
	public String getName() {
		return name;
	}
	
	public boolean isNew() {
		if(isNew == true) {
			isNew = false;
			return true;
		}
		return false;
	}
	
	/**
	 *重写equals必须重写hashCode 
	 *要求如果obj1.equals(obj2)为true，则obj1.hashCode() == obj2.hashCode()为true
	 *如果 obj1.equals(obj2)为false，则obj1.hashCode() == obj2.hashCode()为false
	 *原因：假设某个类，它的equals是根据成员变量nameString是否相等来得到结果的。
	 *现在有两个地址不同的对象，它们name相同，equals的结果是true，但由于地址不同，而hashCode默认根据地址算出
	 *所以两个对象的hashCode不同。现在把这两个对象加到set或者map中，我们希望这两个对象被视为相等的，只有一个加入到set
	 *但是set是根据hashCode来判断是否相等的，所以这两个对象被视为不相等，都加入到了set中，不符合我们的需求。
	 * 所以要重写类的hashCode()，使得返回值为name.hashCode()。这样两个对象的hashCode就相等了。
	 */
	@Override
	public boolean equals(Object obj) {
		if(obj == null)
			return false;
		
		String objString = (String)obj;
		return name.equals(objString);
	}
	
	@Override
	public int hashCode() {
		return name.hashCode();
	}
}
